<?php
/**
 * 模板方法模式
 *
 * 由设计师设计方法的步骤，程序员负责实现每个步骤的方法。
 */
//抽象模板
abstract class AbstractClass
{
	//步骤模板
	public function TemplateMethod()
	{
		$this->PrimitiveMethod1();
		$this->PrimitiveMethod2();
	}
	//具体步骤
	abstract public function PrimitiveMethod1();
	abstract public function PrimitiveMethod2();
}
//具体模板
class ConcreteClass extends AbstractClass
{
	//实现的方法
	public function PrimitiveMethod1()
	{
		echo "ConcreteClass PrimitiveMethod1".PHP_EOL;
	}
	public function PrimitiveMethod2()
	{
		echo "ConcreteClass PrimitiveMethod2".PHP_EOL;
	}
}

//设计师不需要知道具体的方法执行了什么，只要执行模板方法即可
$ConcreteClass = new ConcreteClass();
$ConcreteClass->TemplateMethod();